今天就要寫出第一個CMake值專案啦!主要流程和上一篇介紹的流程一樣。
先使用CMake讀取CMakeLists.txt後生成Makefile, 接下來用Make讀取Makefile後調用g++編譯出最終的執行檔。
├── CMakeLists.txt
└── main.cpp
定義:定義此項目名稱為PROJECT-NAME, 也會新增一些隱式變量
project(<PROJECT-NAME> LANGUAGES <language-name>...])
PROJECT-NAME: 此項目名稱
language-neme: 使用何種編譯器, C = C, CXX = C++ 。
---
此外還會定義出來的變數
${CMAKE_PROJECT_NAME} : 項目名稱
${PROJECT_SOURCE_DIR},${<PROJECT-NAME>_SOURCE_DIR} : 項目源目錄的絕對路徑。
${PROJECT_BINARY_DIR},${<PROJECT-NAME>_BINARY_DIR} : 項目二進制目錄的絕對路徑。
定義:使用指定的source code 編譯後將可執行檔新增至專案。
add_executable (<name> [source1] [source2] ...)
---
name:可執行目標文件的名稱,在一個cmake工程中,這個名稱必須全局唯一。
---
[source1] [source2 ...]:構建執行檔所需要的原始碼。
定義:將訊息印出。
message([<mode>] "message text" ...)
---
mode: 輸出訊息模式
mode = SEND_ERROR : 產生錯誤, 生成過程被跳過
mode = STATUS : 輸出前綴為 - 的一般訊息
mode = FATAL_ERROR : 立即中止所有cmake
---
message text: 想要輸出在terminal的訊息
"message text": 輸出文字
${Variable}: 輸出變量值
🔥 在CMake語法中,指令與變量名稱大小寫是等價的。
定義:設定CMake所需的最小版本。
cmake_minimum_required(VERSION <min>)
min: 最小版本
$ git clone https://github.com/m11112089/2023_iT_CMake.git
$ cd ~/2023_iT_CMake/Day5
$ cmake --version
kai@esoc:~/Desktop/2023_iT_CMake/Day5$ cmake --version
cmake version 3.22.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).
查詢完版本後,使用cmake_minimum_required指令設定最小版本。
cmake_minimum_required(VERSION 3.22.1)
# 根據自己的cmake版本來設定最小版本,要小於等於當前版本
project(cmake_totorial LANGUAGES CXX)
# 設定專案名稱為cmake_totorial,且此項目使用C++
MESSAGE(STATUS "PROJECT_NAME " ${CMAKE_PROJECT_NAME})
MESSAGE(STATUS "SOURCE_DIR " ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "SOURCE_DIR " ${cmake_totorial_SOURCE_DIR})
message(STATUS "BINARY_DIR " ${PROJECT_BINARY_DIR})
message(STATUS "BINARY_DIR " ${cmake_totorial_BINARY_DIR})
#輸出project自動生成的變量,注意命令與變量名稱大小寫等價
add_executable(main main.cpp)
# 將main.cpp編譯成執行檔main
$ cmake .
後面那個點的意思是讓CMake在本目錄(點代表本目錄,點點代表上一層目錄)尋找CMakeLists.txt進行構建。
kai@esoc:~/Desktop/2023_iT_CMake/Day5$ cmake .
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- PROJECT_NAME cmake_totorial
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kai/Desktop/2023_iT_CMake/Day5
在輸出訊息中可以發現剛剛設定要輸出的變量訊息
-- PROJECT_NAME cmake_totorial
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5
$ make
kai@esoc:~/Desktop/2023_iT_CMake/Day5$ make
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
[100%] Built target main
$ ./main
kai@esoc:~/Desktop/2023_iT_CMake/Day5$ ./main
Hello World!!
成功印出 Hello World!! 🎉
有沒有發現CMake的語法比起Makefile友善許多呢?